package 算法.NiuKe.JZ;

import 算法.NiuKe.TreeNode;

import java.util.ArrayDeque;
import java.util.Queue;

/**
 * @author:谢君臣
 * @Date:2021/4/2720:17
 * @version:1.0
 * @function: 请实现一个函数，用来判断一棵二叉树是不是对称的。
 * 注意，如果一个二叉树同此二叉树的镜像是同样的，定义其为对称的。
 */
public class JZ59 {
    boolean isSymmetrical(TreeNode pRoot) {
        Queue<TreeNode> left = new ArrayDeque<>();
        Queue<TreeNode> right = new ArrayDeque<>();
        if (pRoot == null|| pRoot.left== pRoot.right)
            return true;
        else if (pRoot.left.val != pRoot.right.val) return false;
        else {
            left.add(pRoot.left);
            right.add(pRoot.right);
            try {
                while (!left.isEmpty() && !right.isEmpty() && left.size() == right.size()) {
                    TreeNode l = left.poll();
                    TreeNode r = right.poll();
                    if (l.left != null && l.left.val == r.right.val) {
                        left.add(l.left);
                        right.add(r.right);
                    } else if (l.left == r.right) continue; // 为空
                    else return false;
                    if (l.right != null && l.right.val == r.left.val) {
                        left.add(l.right);
                        right.add(r.left);
                    } else if (l.right == r.left) continue; // 为空
                    else return false;
                }
            } catch (Exception e) {
                return false;
            }
            return left.size() == right.size();
        }
    }
}
